import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate } from 'k6/metrics';

// 自定义指标
const errorRate = new Rate('errors');
const createCourseRate = new Rate('create_course_success');

// 测试配置 - 专门针对创建课程的压力测试
export const options = {
  stages: [
    { duration: '10s', target: 5 },  // 10秒内逐渐增加到5个虚拟用户
    { duration: '30s', target: 10 }, // 30秒内增加到10个虚拟用户
    { duration: '1m', target: 10 },  // 保持10个虚拟用户1分钟
    { duration: '10s', target: 0 },  // 10秒内减少到0个虚拟用户
  ],
  thresholds: {
    http_req_duration: ['p(95)<1000'], // 95%的请求响应时间小于1000ms
    http_req_failed: ['rate<0.05'],    // 失败率小于5%
    errors: ['rate<0.05'],             // 错误率小于5%
    create_course_success: ['rate>0.95'], // 创建课程成功率大于95%
  },
};

// 基础URL配置
const BASE_URL = 'http://localhost:8081/api';

// 测试教师用户
const TEACHER_USER = {
  account: 'teacher001',
  password: 'teacher123'
};

// 生成随机课程数据
function generateRandomCourse() {
  const timestamp = Date.now();
  const randomId = Math.floor(Math.random() * 100000);
  const courseId = `COURSE${timestamp}${randomId}`;
  
  const subjects = [
    '高等数学', '线性代数', '概率论与数理统计', '离散数学',
    '数据结构', '算法设计与分析', '计算机网络', '操作系统',
    '数据库原理', '软件工程', '人工智能', '机器学习',
    '大学物理', '电路分析', '数字电路', '模拟电路',
    '大学英语', '学术写作', '商务英语', '英语听说'
  ];
  
  const methods = [
    '期末考试(70%) + 平时作业(30%)',
    '期末考试(60%) + 期中考试(20%) + 平时作业(20%)',
    '项目答辩(50%) + 实验报告(30%) + 平时表现(20%)',
    '论文(40%) + 答辩(30%) + 课堂参与(30%)',
    '实验报告(40%) + 期末考试(40%) + 平时作业(20%)',
    '综合项目(60%) + 阶段测试(40%)'
  ];
  
  const subject = subjects[Math.floor(Math.random() * subjects.length)];
  const method = methods[Math.floor(Math.random() * methods.length)];
  
  return {
    courseId: courseId,
    courseName: `${subject}_${randomId}`,
    course: `这是一门关于${subject}的专业课程，旨在培养学生的理论基础和实践能力。课程内容涵盖核心概念、方法论和最新发展趋势。`,
    teachingGoal: `通过本课程学习，学生将系统掌握${subject}的基本理论、核心方法和实际应用，培养分析问题和解决问题的能力。`,
    examinationMethod: method
  };
}

// 教师登录获取用户ID
function teacherLogin() {
  const loginPayload = `account=${TEACHER_USER.account}&password=${TEACHER_USER.password}`;

  const loginResponse = http.post(`${BASE_URL}/users/login`, loginPayload, {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
  });

  const loginSuccess = check(loginResponse, {
    '教师登录状态码为200': (r) => r.status === 200,
    '教师登录响应时间 < 500ms': (r) => r.timings.duration < 500,
  });

  if (!loginSuccess) {
    console.log(`教师登录失败, 状态码: ${loginResponse.status}, 响应: ${loginResponse.body}`);
    return null;
  }

  try {
    const loginBody = JSON.parse(loginResponse.body);
    return loginBody.userId;
  } catch (e) {
    console.log('无法解析教师登录响应');
    return null;
  }
}

// 创建课程测试
function testCreateCourse(userId) {
  if (!userId) {
    errorRate.add(1);
    createCourseRate.add(0);
    return;
  }

  // 生成课程数据
  const newCourse = generateRandomCourse();
  
  // 构造创建课程的请求payload
  const createCoursePayload = {
    courses: newCourse,
    userId: userId
  };

  const createResponse = http.post(`${BASE_URL}/courses/createCourse`, JSON.stringify(createCoursePayload), {
    headers: {
      'Content-Type': 'application/json',
    },
  });

  const createSuccess = check(createResponse, {
    '创建课程状态码为201': (r) => r.status === 201,
    '创建课程响应时间 < 1500ms': (r) => r.timings.duration < 1500,
    '返回创建的课程信息': (r) => {
      try {
        const body = JSON.parse(r.body);
        return body && body.courseId === newCourse.courseId && body.courseName === newCourse.courseName;
      } catch (e) {
        return false;
      }
    },
    '课程ID格式正确': (r) => {
      try {
        const body = JSON.parse(r.body);
        return body && body.courseId && body.courseId.startsWith('COURSE');
      } catch (e) {
        return false;
      }
    },
  });

  if (createSuccess) {
    errorRate.add(0);
    createCourseRate.add(1);
    console.log(`✓ 成功创建课程: ${newCourse.courseName} (${newCourse.courseId})`);
  } else {
    errorRate.add(1);
    createCourseRate.add(0);
    console.log(`✗ 创建课程失败: ${newCourse.courseId}, 状态码: ${createResponse.status}, 响应: ${createResponse.body}`);
  }

  return createResponse;
}

// 主测试函数
export default function () {
  // 每次测试都重新登录以获取用户ID
  const userId = teacherLogin();
  
  if (userId) {
    // 执行创建课程测试
    testCreateCourse(userId);
  } else {
    console.log('跳过创建课程测试: 教师登录失败');
    errorRate.add(1);
    createCourseRate.add(0);
  }

  // 模拟用户操作间隔
  sleep(Math.random() * 1 + 0.5); // 0.5-1.5秒随机等待
}

// 测试设置函数
export function setup() {
  console.log('开始创建课程压力测试...');
  console.log(`测试目标: ${BASE_URL}`);
  console.log('测试接口: POST /api/courses/createCourse');
  console.log(`测试用户: ${TEACHER_USER.account}`);
  console.log('测试说明: 模拟教师用户批量创建课程的场景');
  
  // 验证教师用户是否可以登录
  const testUserId = teacherLogin();
  if (testUserId) {
    console.log(`✓ 教师用户验证成功, 用户ID: ${testUserId}`);
  } else {
    console.log('✗ 教师用户验证失败, 请检查用户账号和密码');
  }
  
  return {};
}

// 测试结束函数
export function teardown(data) {
  console.log('创建课程压力测试完成!');
  console.log('测试结果摘要:');
  console.log('- 检查创建课程成功率指标');
  console.log('- 检查响应时间性能指标');
  console.log('- 检查错误率统计');
}